// 原始类型
let age: number = 18

let isLoading: boolean = true

let uame: string = 'zhangsan'

// 数组类型
const arr: number[] = [1, 2, 3]

const arr2: Array<number> = [1, 2, 3]

// 联合类型
const stuArray: (string | number)[] = [1, 'a', 3]
const stuArray2: Array<string | number> = [1, 'a', 3]

// 类型别名 type 又叫自定义类型
type CustomArray = Array<string | number>
const stuArray3: CustomArray = [1, 'a', 3]


// 函数类型
function sum(a: number, b: number): number {
    return a + b
}
const sum1 = (a: number, b: number): number => a + b

// sum(1, 2)
// sum1(1, 2)

// 封装 公共的函数类型
type SumFn = (a: number, b: number) => number
const sum2: SumFn = (a, b) => a + b


// 函数 void 类型
function sayHello(): void {
    console.log('hello')
}

// 函数 可选参数 类型 ?
function mySlice(start?: number, end?: number): void {
    console.log(start, end)
}
// mySlice()
// mySlice(1)
// mySlice(1, 2)

// 对象 类型
const person: { name: string; age: number; sayHi: () => void; greet(name: string): void } = {
    name: 'zhangsan',
    age: 18,
    sayHi() {
        console.log('hi')
    },
    greet(name) {
        console.log(`hi, ${name}`)
    }
}

// 对象中的 可选属性
function myAxios(config: { url: string; method?: string; data?: any; params?: any }) {
    console.log(config)
}

// myAxios({ url: '/user/login' })


// 接口 类型
interface IPerson {
    name: string
    age: number
    sayHi(): void
}
const person1: IPerson = {
    name: 'zhangsan',
    age: 18,
    sayHi() { }
}


// 接口 继承
interface Point2D { x: number, y: number }
interface Point3D extends Point2D { z: number }


// 元组 类型 ( 长度 固定， 特定索引 对应 特定类型 )
const point: [number, number] = [1, 2]


// 类型推论 机制
let a = 1
let SumFn = (a: number, b: number) => a + b


// 类型断言
const aLink = document.getElementById('aLink') as HTMLAnchorElement
// 另外的一种断言方式
const aLink2 = <HTMLAnchorElement>document.getElementById('aLink')
aLink.href = 'https://www.baidu.com'
